<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Customizing Dynamic Mapping | Elasticsearch: The Definitive Guide [2.x] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch: The Definitive Guide [2.x]">
<link rel="up" href="index-management.html" title="Index Management">
<link rel="prev" href="dynamic-mapping.html" title="Dynamic Mapping">
<link rel="next" href="default-mapping.html" title="Default Mapping">
<meta name="DC.type" content="Learn/Docs/Legacy/Elasticsearch/Definitive Guide/2.x">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="2.x">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<p>
  <strong>WARNING</strong>: The 2.x versions of Elasticsearch have passed their
  <a href="https://www.elastic.co/support/eol">EOL dates</a>. If you are running
  a 2.x version, we strongly advise you to upgrade.
</p>
<p>
  This documentation is no longer maintained and may be removed. For the latest
  information, see the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html">current
  Elasticsearch documentation</a>.
</p>
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: The Definitive Guide [2.x]</a></span>
»
<span class="breadcrumb-link"><a href="getting-started.html">Getting Started</a></span>
»
<span class="breadcrumb-link"><a href="index-management.html">Index Management</a></span>
»
<span class="breadcrumb-node">Customizing Dynamic Mapping</span>
</div>
<div class="navheader">
<span class="prev">
<a href="dynamic-mapping.html">« Dynamic Mapping</a>
</span>
<span class="next">
<a href="default-mapping.html">Default Mapping »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="custom-dynamic-mapping"></a>Customizing Dynamic Mapping<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/070_Index_Mgmt/40_Custom_Dynamic_Mapping.asciidoc">edit</a>
</h2>
</div></div></div>
<p>If you know that you are going to be adding new fields on the fly,
you probably want to leave dynamic mapping enabled.  At times, though,
the dynamic mapping “rules” can be a bit blunt.  Fortunately, there
are settings that you can use to customize these rules to better
suit your data.</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="date-detection"></a>date_detection<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/070_Index_Mgmt/40_Custom_Dynamic_Mapping.asciidoc">edit</a>
</h3>
</div></div></div>
<p>When Elasticsearch encounters a new string field, it checks to see if the
string contains a recognizable date, like <code class="literal">2014-01-01</code>. If it looks
like a date, the field is added as type <code class="literal">date</code>. Otherwise, it is
added as type <code class="literal">string</code>.</p>
<p>Sometimes this behavior can lead to problems.  Imagine that you index
a document like this:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{ "note": "2014-01-01" }</pre>
</div>
<p>Assuming that this is the first time that the <code class="literal">note</code> field has been seen,
it will be added as a <code class="literal">date</code> field.  But what if the next document looks
like this:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{ "note": "Logged out" }</pre>
</div>
<p>This clearly isn’t a date, but it is too late.  The field is already
a date field and so this “malformed date” will cause an exception to be
thrown.</p>
<p>Date detection can be turned off by setting <code class="literal">date_detection</code> to <code class="literal">false</code>
on the root object:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT /my_index
{
    "mappings": {
        "my_type": {
            "date_detection": false
        }
    }
}</pre>
</div>
<p>With this mapping in place, a string will always be a <code class="literal">string</code>.  If you need
a <code class="literal">date</code> field, you have to add it manually.</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>Elasticsearch’s idea of which strings look like dates can be altered
with the <a href="/guide/en/elasticsearch/reference/2.4/dynamic-field-mapping.html#date-detection" class="ulink" target="_top"><code class="literal">dynamic_date_formats</code> setting</a>.</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="dynamic-templates"></a>dynamic_templates<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/070_Index_Mgmt/40_Custom_Dynamic_Mapping.asciidoc">edit</a>
</h3>
</div></div></div>
<p>With <code class="literal">dynamic_templates</code>, you can take complete control over the
mapping that is generated for newly detected fields. You
can even apply a different mapping depending on the field name
or datatype.</p>
<p>Each template has a name, which you can use to describe what the template
does, a <code class="literal">mapping</code> to specify the mapping that should be applied, and
at least one parameter (such as <code class="literal">match</code>) to define which fields the template
should apply to.</p>
<p>Templates are checked in order; the first template that matches is
applied. For instance, we could specify two templates for <code class="literal">string</code> fields:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">es</code>: Field names ending in <code class="literal">_es</code> should use the <code class="literal">spanish</code> analyzer.
</li>
<li class="listitem">
<code class="literal">en</code>: All others should use the <code class="literal">english</code> analyzer.
</li>
</ul>
</div>
<p>We put the <code class="literal">es</code> template first, because it is more specific than the
catchall <code class="literal">en</code> template, which matches all string fields:</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">PUT /my_index
{
    "mappings": {
        "my_type": {
            "dynamic_templates": [
                { "es": {
                      "match":              "*_es", <a id="CO35-1"></a><i class="conum" data-value="1"></i>
                      "match_mapping_type": "string",
                      "mapping": {
                          "type":           "string",
                          "analyzer":       "spanish"
                      }
                }},
                { "en": {
                      "match":              "*", <a id="CO35-2"></a><i class="conum" data-value="2"></i>
                      "match_mapping_type": "string",
                      "mapping": {
                          "type":           "string",
                          "analyzer":       "english"
                      }
                }}
            ]
}}}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/070_Index_Mgmt/40_Custom_dynamic_mapping.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO35-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>Match string fields whose name ends in <code class="literal">_es</code>.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO35-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>Match all other string fields.</p>
</td>
</tr>
</table>
</div>
<p>The <code class="literal">match_mapping_type</code>  allows you to apply the template only
to fields of the specified type, as detected by the standard dynamic
mapping rules, (for example <code class="literal">string</code> or <code class="literal">long</code>).</p>
<p>The <code class="literal">match</code> parameter matches just the field name, and the <code class="literal">path_match</code>
parameter matches the full path to a field in an object, so
the pattern <code class="literal">address.*.name</code> would match a field like this:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
    "address": {
        "city": {
            "name": "New York"
        }
    }
}</pre>
</div>
<p>The <code class="literal">unmatch</code> and <code class="literal">path_unmatch</code> patterns can be used to exclude fields
that would otherwise match.</p>
<p>More configuration options can be found in the
<a href="/guide/en/elasticsearch/reference/2.4/dynamic-mapping.html" class="ulink" target="_top">dynamic mapping documentation</a>.</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="dynamic-mapping.html">« Dynamic Mapping</a>
</span>
<span class="next">
<a href="default-mapping.html">Default Mapping »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
